package sdk

import (
	"bytes"
	"encoding/json"
	"errors"
	"net/url"
	"strings"

	"gitee.com/wz-open-platform/wzopen-sdk-go/constants"
	"gitee.com/wz-open-platform/wzopen-sdk-go/model"
	"gitee.com/wz-open-platform/wzopen-sdk-go/tools"
	"github.com/tidwall/gjson"
)

// 使设备重启
func (c *client) DeviceStateRestart(req *model.DeviceStateRestart) (resp *model.Response, err error) {
	method := "POST"
	postparams := tools.StructToMap(req)
	postparams = c.buildPostParam(postparams)
	postparamBytes, err := json.Marshal(postparams)
	if err != nil {
		return
	}
	bytes, err := tools.DoHttp(c.baseURL+"/open/device/state/restart", method, map[string]string{}, bytes.NewBuffer([]byte(postparamBytes)), nil)
	if err != nil {
		return
	}
	if gjson.GetBytes(bytes, "code").Int() != constants.SucceedCode {
		err = errors.New(gjson.GetBytes(bytes, "message").String())
		return
	}
	err = json.Unmarshal(bytes, &resp)
	return
}

// 使设备离线
func (c *client) DeviceStateOffline(req *model.DeviceStateOffline) (resp *model.Response, err error) {
	method := "POST"
	postparams := tools.StructToMap(req)
	postparams = c.buildPostParam(postparams)
	postparamBytes, err := json.Marshal(postparams)
	if err != nil {
		return
	}
	bytes, err := tools.DoHttp(c.baseURL+"/open/device/state/offline", method, map[string]string{}, bytes.NewBuffer([]byte(postparamBytes)), nil)
	if err != nil {
		return
	}
	if gjson.GetBytes(bytes, "code").Int() != constants.SucceedCode {
		err = errors.New(gjson.GetBytes(bytes, "message").String())
		return
	}
	err = json.Unmarshal(bytes, &resp)
	return
}

// 设置离线收益
func (c *client) DeviceStateOfflineProfit(req *model.DeviceStateOfflineProfit) (resp *model.Response, err error) {
	method := "POST"
	postparams := tools.StructToMap(req)
	postparams = c.buildPostParam(postparams)
	postparamBytes, err := json.Marshal(postparams)
	if err != nil {
		return
	}
	bytes, err := tools.DoHttp(c.baseURL+"/open/device/state/offline_profit", method, map[string]string{}, bytes.NewBuffer([]byte(postparamBytes)), nil)
	if err != nil {
		return
	}
	if gjson.GetBytes(bytes, "code").Int() != constants.SucceedCode {
		err = errors.New(gjson.GetBytes(bytes, "message").String())
		return
	}
	err = json.Unmarshal(bytes, &resp)
	return
}

// 设置端口故障
func (c *client) DeviceStatePortError(req *model.DeviceStatePortError) (resp *model.Response, err error) {
	method := "POST"
	postparams := tools.StructToMap(req)
	postparams = c.buildPostParam(postparams)
	postparamBytes, err := json.Marshal(postparams)
	if err != nil {
		return
	}
	bytes, err := tools.DoHttp(c.baseURL+"/open/device/state/port/error", method, map[string]string{}, bytes.NewBuffer([]byte(postparamBytes)), nil)
	if err != nil {
		return
	}
	if gjson.GetBytes(bytes, "code").Int() != constants.SucceedCode {
		err = errors.New(gjson.GetBytes(bytes, "message").String())
		return
	}
	err = json.Unmarshal(bytes, &resp)
	return
}

// 获取设备状态
func (c *client) DeviceState(req *model.DeviceStateReq) (resp *model.DeviceStateResp, err error) {
	method := "GET"
	getparams := url.Values{}
	getparams.Add("device_num", req.DeviceNum)
	if len(req.PortFields) > 0 {
		getparams.Add("port_fields", strings.Join(req.PortFields, ","))
	}
	getparams = c.buildGetParam(getparams)
	bytes, err := tools.DoHttp(c.baseURL+"/open/device/state", method, map[string]string{}, nil, getparams)
	if err != nil {
		return
	}
	if gjson.GetBytes(bytes, "code").Int() != constants.SucceedCode {
		err = errors.New(gjson.GetBytes(bytes, "message").String())
		return
	}
	err = json.Unmarshal(bytes, &resp)
	return
}
